{
 "cells": [
  {
   "cell_type": "markdown",
   "source": [
    "# Outputs"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Each cell output is a mapping from MIME-type such as `text/plain`, `text/html` or `image/png`, to the actual value. For example:"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2023-05-31T18:49:29.894359400Z",
     "start_time": "2023-05-31T18:49:29.201944100Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "Plain text"
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "MIME(\"text/plain\" to \"Plain text\")"
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "To refer MIME type, you can refer `MimeTypes` object:"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [
    {
     "data": {
      "text/plain": "Plain text"
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "MIME(MimeTypes.PLAIN_TEXT to \"Plain text\")"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T18:49:29.936067Z",
     "start_time": "2023-05-31T18:49:29.466218Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "All the objects that have no defined renderers, are rendered to the plain text automatically."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [
    {
     "data": {
      "text/plain": "Plain text"
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"Plain text\""
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T18:49:29.957010Z",
     "start_time": "2023-05-31T18:49:29.703337500Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Cell can have several outputs, use `DISPLAY` to render them"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [
    {
     "data": {
      "text/plain": "Plain text 1"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "Plain text 2"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "DISPLAY(\"Plain text 1\")\n",
    "DISPLAY(MIME(MimeTypes.PLAIN_TEXT to \"Plain text 2\"))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T18:49:30.410203800Z",
     "start_time": "2023-05-31T18:49:29.823883600Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "HTML can be rendered this way:"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "outputs": [
    {
     "data": {
      "text/html": "<b>HTML</b> text"
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "MIME(MimeTypes.HTML to \"<b>HTML</b> text\")"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T18:49:30.539822900Z",
     "start_time": "2023-05-31T18:49:30.039789100Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "There is also a shortcut for rendering HTML:"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "outputs": [
    {
     "data": {
      "text/html": "<b>HTML</b> text"
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "HTML(\"<b>HTML</b> text\")"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T18:49:30.579440100Z",
     "start_time": "2023-05-31T18:49:30.185425100Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "As it was said above, output is a map, thus it can have several key-value pairs. Only value with the highest priority will be rendered.\n",
    "Priorities are client-specific, and might be found in [this StackOverflow answer](https://stackoverflow.com/a/67276689)."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "outputs": [
    {
     "data": {
      "text/plain": "Plain text",
      "text/html": "<b>HTML</b> text"
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "MIME(\n",
    "    MimeTypes.PLAIN_TEXT to \"Plain text\",\n",
    "    MimeTypes.HTML to \"<b>HTML</b> text\",\n",
    ")"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T18:49:30.798651300Z",
     "start_time": "2023-05-31T18:49:30.314809800Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Images could be rendered as HTML using an `<img>` tag. But there is a separate MIME type for this purpose, use it in Kotlin Notebook as it doesn't utilize web rendering, and renders natively"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAEcUlEQVR4Xu3SMY4cMQADwf3/p+1cHWvAE4pAJR3z9/v9/gH8EQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqoRPmN3Y+TOek/AJsxs7f8ZzEj5hdmPnz3hOwifMbuz8Gc9J+ITZjZ0/4zkJnzC7sfNnPCfhE2Y3dv6M5yR8wuzGzp/xnIRPmN3Y+TOek/AJsxs7f8ZzEj5hdmPnz3hOwifMbuz8Gc9J+ITZjZ0/4zkJnzC7sfNnPCfhE2Y3dv6M5yR8wuzGzp/xnIRPmN3Y+TOek/AJsxs7f8ZzEj5hdmPnz3hOwifMbuz8Gc9J+ITZjZ0/4zkJnzC7sfNnPCfhE2Y3dv6M5yR8wuzGzp/xnIRPmN3Y+TOek/AJsxs7f8ZzEj5hdmPnz3hOwifMbuz8Gc9J+ITZjZ0/4zkJnzC7sfNnPCcBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAEz6D5tIz0MBx/WUAAAAAElFTkSuQmCC"
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "MIME(MimeTypes.PNG to \"iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAEcUlEQVR4Xu3SMY4cMQADwf3/p+1cHWvAE4pAJR3z9/v9/gH8EQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqoRPmN3Y+TOek/AJsxs7f8ZzEj5hdmPnz3hOwifMbuz8Gc9J+ITZjZ0/4zkJnzC7sfNnPCfhE2Y3dv6M5yR8wuzGzp/xnIRPmN3Y+TOek/AJsxs7f8ZzEj5hdmPnz3hOwifMbuz8Gc9J+ITZjZ0/4zkJnzC7sfNnPCfhE2Y3dv6M5yR8wuzGzp/xnIRPmN3Y+TOek/AJsxs7f8ZzEj5hdmPnz3hOwifMbuz8Gc9J+ITZjZ0/4zkJnzC7sfNnPCfhE2Y3dv6M5yR8wuzGzp/xnIRPmN3Y+TOek/AJsxs7f8ZzEj5hdmPnz3hOwifMbuz8Gc9J+ITZjZ0/4zkJnzC7sfNnPCcBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAEz6D5tIz0MBx/WUAAAAAElFTkSuQmCC\")"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T18:49:30.844164500Z",
     "start_time": "2023-05-31T18:49:30.517882100Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "[Kandy](https://github.com/Kotlin/kandy) library renders plots to both HTML and JSON spec that is rendered natively to a Swing component.\n",
    "You can render this spec even without using Kandy library. Ensure that `lets.plot.swing.outputs.enabled` registry key is enabled."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [
    {
     "data": {
      "application/plot+json": {
       "output_type": "lets_plot_spec",
       "output": {
        "mapping": {},
        "data": {
         "x": [
          1.0,
          2.0,
          3.0
         ],
         "y": [
          1.0,
          2.0,
          3.0
         ]
        },
        "kind": "plot",
        "scales": [
         {
          "aesthetic": "x",
          "limits": [
           null,
           null
          ]
         },
         {
          "aesthetic": "y",
          "limits": [
           null,
           null
          ]
         }
        ],
        "layers": [
         {
          "mapping": {
           "x": "x",
           "y": "y"
          },
          "stat": "identity",
          "sampling": "none",
          "position": "dodge",
          "geom": "bar"
         }
        ]
       },
       "apply_color_scheme": true,
       "swing_enabled": true
      }
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import kotlinx.serialization.decodeFromString\n",
    "import kotlinx.serialization.json.Json\n",
    "import kotlinx.serialization.json.JsonElement\n",
    "import kotlinx.serialization.json.buildJsonObject\n",
    "\n",
    "val jsonSpec = Json.decodeFromString<JsonElement>(\n",
    "    \"\"\"\n",
    "      {\n",
    "       \"output_type\": \"lets_plot_spec\",\n",
    "       \"output\": {\n",
    "        \"mapping\": {},\n",
    "        \"data\": {\n",
    "         \"x\": [\n",
    "          1.0,\n",
    "          2.0,\n",
    "          3.0\n",
    "         ],\n",
    "         \"y\": [\n",
    "          1.0,\n",
    "          2.0,\n",
    "          3.0\n",
    "         ]\n",
    "        },\n",
    "        \"kind\": \"plot\",\n",
    "        \"scales\": [\n",
    "         {\n",
    "          \"aesthetic\": \"x\",\n",
    "          \"limits\": [\n",
    "           null,\n",
    "           null\n",
    "          ]\n",
    "         },\n",
    "         {\n",
    "          \"aesthetic\": \"y\",\n",
    "          \"limits\": [\n",
    "           null,\n",
    "           null\n",
    "          ]\n",
    "         }\n",
    "        ],\n",
    "        \"layers\": [\n",
    "         {\n",
    "          \"mapping\": {\n",
    "           \"x\": \"x\",\n",
    "           \"y\": \"y\"\n",
    "          },\n",
    "          \"stat\": \"identity\",\n",
    "          \"sampling\": \"none\",\n",
    "          \"position\": \"dodge\",\n",
    "          \"geom\": \"bar\"\n",
    "         }\n",
    "        ]\n",
    "       },\n",
    "       \"apply_color_scheme\": true,\n",
    "       \"swing_enabled\": true\n",
    "      }\n",
    "\"\"\"\n",
    ")\n",
    "\n",
    "MimeTypedResultEx(buildJsonObject {\n",
    "    put(\"application/plot+json\", jsonSpec)\n",
    "})"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T18:49:31.232043500Z",
     "start_time": "2023-05-31T18:49:30.666374Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-05-31T18:49:31.236032500Z",
     "start_time": "2023-05-31T18:49:31.225061700Z"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Kotlin",
   "language": "kotlin",
   "name": "kotlin"
  },
  "language_info": {
   "name": "kotlin",
   "version": "1.8.20",
   "mimetype": "text/x-kotlin",
   "file_extension": ".kt",
   "pygments_lexer": "kotlin",
   "codemirror_mode": "text/x-kotlin",
   "nbconvert_exporter": ""
  },
  "ktnbPluginMetadata": {
   "isAddProjectLibrariesToClasspath": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
